详述近期遭利用的 Atlassian Confluence OGNL 注入漏洞 (CVE-2021-26084)
编译:代码卫士
Atlassian Confluence Server and Data Center 的 Webwork模块中被指存在一个对象图导航语言 (OGNL) 注入漏洞,是由输入验证不充分造成的 OGNL 用户输入提升造成的。
远程未认证攻击者可向目标服务器发送特殊构造的请求来利用该漏洞,可导致在受影响服务器的安全上下文中执行任意代码。
Atlassian Confluence 是通过 Java 编写的协作平台。用户可使用空格、页面和博客创建内容,其它用户可进行评论编辑。该平台主要通过Java 编写且在绑定的 Apache Tomcat 应用服务器上运行。在默认情况下,Confluence 可通过端口8090/TCP 上的 HTTP 访问。
HTTP 是 RFCs 7230-7237 和其它 RFCs 中描述的请求/响应协议。客户端向服务器发送请求,服务器向客户端发回响应。HTTP 请求由请求行、多个标头、一个空行和一个可选的消息主题组成:
Request = Request-Line headers CRLF [message-body]
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
Headers = *[Header]
Header = Field-Name ":" Field-Value CRLF
其中,CRLF 表示新行序列回车键 (CR),其后为换行符 (LF)。SP表示的是空行字符。根据所使用的 Method 和 Content-Type 标头,可将参数从客户端传递到服务器作为在Request-URI或在消息主题中的值对。例如,使用GET方法传递值为“1”的名为“param”的参数的简单HTTP请求可能如下:
GET /my_webapp/mypaget.htm?param=1 HTTP/1.1
Host: www.myhost.com
使用 POST 方法,相应HTTP请求可能如下:
POST /my_webapp/mypage.htm HTTP/1.1
Host: www.myhost.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
param=1
Confluence 通过 Webwork web 应用框架将URL 映射到Java 类,创建“action”。Action 的URL以 “.action” 为后缀且在 confluence-<version>中的 xwork.xml 文件中(<version>是 Confluence 的版本号)和所包含插件的 JAR 文件的 atlassian-plugin.xml 文件中定义。每个action 条目包含至少一个名称属性、定义action 名称、一个class 属性、定义实现该 action 的 Java 类,以及至少一个result 元素(基于action的结果撤销该 action 后要渲染的 Velocity 模板)。虽然action返回的常见值为 “error’、”input” 和 “success”,但在相关联的 XWork XML 中存在匹配的 result 元素,则可能使用任意值。Action 条目中可能包含一个 method属性,允许撤销指定Java类的特定方法。如命令未指定,则调用action类的 doDefault() 方法。如下是 doenterpagevariables action 的action 条目样例:
<action name="doenterpagevariables" class="com.atlassian.confluence.pages.actions.PageVariablesAction"
method="doEnter">
<result name="error" type="velocity">/pages/createpage-entervariables.vm</result>
<result name="input" type="velocity">/pages/createpage-entervariables.vm</result>
<result name="success" type="velocity">/pages/createpage.vm</result>
</action>
在上例中,com.atlassian.confluence.pages.actions.PageVariablesAction 类的 doEnter() 方法处理 “doenterpagevariables.action” 的请求并将访问值如 “success”、”input” 或 “error”。这就使正确的 Velocity 模板被渲染。
Confluence 支持使用OGNL表达式从使用 Webwork库的 Velocity 模板生成网页内容。OGNL 是一种动态的表达式语言 (EL),在获取和设置Java 对象、list 投影 (projections)、lambda 表达式的属性方面具有简洁的语法。OGNL 表达式包含组成导航链的字符串。这些字符串可以是属性名称、方法调用、数组索引等。OGNL表达式以OGNL Context 的形式,根据提供给评估器的初始或根上下文对象进行评估。
Confluence 使用类 com.opensymphony.webwork.views.jsp.ui.template.TemplateRenderingContext 的容器对象存储需要执行 Action 的对象。这些对象包括会话标识符、请求参数、spaceKey 等。TemplateRenderingContext 还包括一个 com.opensymphony.xwork.util.OgnlValueStack 对象,推送并存储评估动态表达式语言 (EL) 的对象。当 EL 编译器需要解析表达式时,搜索以被最近推送的对象开头的栈。OGNL 是 Webwork 库用于渲染在 Confluence 中定义的 Velocity 模板的 EL,从而访问通过当前上下文暴露的 Confluence 对象。例如,$action 变量返回当前的 Webwork action 对象。
Velocity 模板中的 OGNL 表达式通过 ognl.OgnlParser.expressioni() 方法解析。基于输入字符串,该表达式被解析为一系列令牌。ognl.JavaCharStream.readChar() 方法被 OGNL 解析器调用,以“\Uxxxx” 的形式评估 Unicode 逃逸字符,其中 “XXXX” 是所表示 Unicode字符的十六进制代码。因此,如果一个表达式中包含字符串 “\u0027”,则该字符被评估为右引号字符 (‘),逃逸作为字符常值的评估上下文,从而附加任意的 OGNL 表达式。如果OGNL 表达式是在单引号中的 Velocity 模板中解析且该表达式的值是在没有任何清理的情况下从用户输入中获得,那么就能够注入任意的 OGNL 表达式。
OGNL 注入漏洞存在于 Atlassian Confluence 中。由于对用于在单引号内设置在 Velocity 模板中评估的变量的用户输入验证不充分造成该漏洞。通过在用户输入中包含 “\u0027”字符,攻击者能够逃逸字符常值并附加一个任意的 OGNL 表达式。
在 Webwork 评估 OGNL 表达式之前,这些表达式会和com.opensymphony.webwork.util.SafeExpressionUtil.containsUnsafeExpression()方法中不安全的节点类型、属性名称、方法名称和变量名称清单进行比对。然而,该清单并非无穷尽,任意 Java 对象均可在无需使用任何所列的不安全元素的情况下进行初始化。例如,如下表达式执行OS命令,将被该方法认为是安全的表达式。
"" + Class.forName("java.lang.Runtime").getMethod("getRuntime", null).invoke(null, null).exec("touch /tmp/TMSR") + ""
远程攻击者可向易受攻击的服务器发送包含恶意参数的构造的HTTP请求,利用该漏洞。成功利用可导致攻击者以服务器权限执行任意代码。
要检测该攻击,应当监控所有的HTTP流量请求,其中 request-URI 的路径组件包含下表 “URI 路径“栏中的其中一个字符串:
URI Path Vulnerable Parameters
---------------------------------------------------------------------
/users/darkfeatures.action featureKey
/users/enabledarkfeature.action featureKey
/users/disabledarkfeature.action featureKey
/login.action token
/dologin.action token
/signup.action token
/dosignup.action token
/pages/createpage-entervariables.action queryString, linkCreation
/pages/doenterpagevariables.action queryString
/pages/createpage.action queryString
/pages/createpage-choosetemplate.action queryString
/pages/docreatepagefromtemplate.action queryString
/pages/docreatepage.action queryString
/pages/createblogpost.action queryString
/pages/docreateblogpost.action. queryString
/pages/copypage.action queryString
/pages/docopypage.action queryString
/plugins/editor-loader/editor.action syncRev
如发现此类请求,则应查看 HTTP 请求方法。如该请求方法是 POST,则从 HTTP 请求的主体中查找上表中出现的易受攻击参数;如果该请求方法是 GET,则应该查找 HTTP 请求的 request-URI 中的参数。查看易受攻击参数中的值中是否包含字符串 “\u0027” 或其 URL编码格式。如是,则应认为流量是恶意流量,该漏洞可能正遭利用。
Atlassian 在2021年8月25日修复该漏洞。该公司的安全公告已更新数次,说明正在活跃的攻击以及说明客户如何识别自己是否正在使用 Confluence Cloud。虽然该公司列出一些缓解措施,但考虑到该漏洞目前遭利用的范围之广,最好的方法是应用补丁并加强系统监控。
Confluence 企业服务器正遭攻击FireEye 红队失窃工具大揭秘之:分析复现 Confluence路径穿越漏洞 (CVE-2019-3398)
Apache Struts 修复 OGNL 技术中可能存在的 RCE 缺陷
https://www.zerodayinitiative.com/blog/2021/9/21/cve-2021-26084-details-on-the-recently-exploited-atlassian-confluence-ognl-injection-bug
题图:Pixabay License
本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。